home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-08-18 | 3.7 KB | 166 lines | [TEXT/R*ch] |
- (* filename.mlp *)
-
- open CharVector;
-
- fun check_suffix name suff =
- let val name_len = size name
- val suff_len = size suff
- in
- name_len >= suff_len andalso
- extract(name, name_len - suff_len, SOME suff_len) = suff
- end;
-
- fun chop_suffix name suff =
- extract(name, 0, SOME (size name - size suff))
- ;
-
- #ifdef unix
- val current_dir_name = ".";
-
- fun concat dirname filename =
- let val len = size dirname
- val x = if len = 0 then "/" else extract(dirname, len-1, SOME 1)
- in
- case x of
- "/" => dirname ^ filename
- | _ => dirname ^ "/" ^ filename
- end;
-
- fun is_absolute n =
- let val len = size n in
- (len >= 1 andalso extract(n, 0, SOME 1) = "/") orelse
- (len >= 2 andalso extract(n, 0, SOME 2) = "./") orelse
- (len >= 3 andalso extract(n, 0, SOME 3) = "../")
- end;
-
- fun slash_pos s =
- let fun pos i =
- if i < 0 then NONE else
- case extract(s, i, SOME 1) of
- "/" => SOME i
- | _ => pos (i - 1)
- in pos (size s - 1) end
- ;
-
- fun basename name =
- case slash_pos name of
- SOME p =>
- extract(name, p+1, NONE)
- | NONE => name
- ;
-
- fun dirname name =
- if name = "/" then name else
- case slash_pos name of
- SOME p => extract(name, 0, SOME p)
- | NONE => "."
- ;
- #endif
-
- #ifdef macintosh
- val current_dir_name = ":";
-
- fun is_absolute n =
- let val len = size n
- fun h i =
- if i >= len then false
- else if extract(n, i, SOME 1) = ":" then true
- else h (i+1)
- in h 0 end;
-
- fun concat dirname filename =
- let val dirname1 =
- if is_absolute dirname
- then dirname
- else ":" ^ dirname
- val l = size dirname1 - 1
- val dirname2 =
- if l < 0 orelse extract(dirname1, l, SOME 1) = ":"
- then dirname1
- else dirname1 ^ ":"
- val len = size filename
- val filename2 =
- if len > 0 andalso extract(filename, 0, SOME 1) = ":"
- then extract(filename, 1, NONE)
- else filename
- in dirname2 ^ filename2 end
- ;
-
- fun colon_pos s =
- let fun pos i =
- if i < 0 then NONE else
- case extract(s, i, SOME 1) of
- ":" => SOME i
- | _ => pos (i - 1)
- in pos (size s - 1) end
- ;
-
- fun basename name =
- case colon_pos name of
- SOME p =>
- extract(name, p+1, NONE)
- | NONE => name
- ;
-
- fun dirname name =
- if name = ":" then name else
- case colon_pos name of
- SOME p => extract(name, 0, SOME p)
- | NONE => ":"
- ;
- #endif
-
- #ifdef msdos
- val current_dir_name = ".";
-
- fun concat dirname filename =
- let val len = size dirname
- val x = if len = 0 then "\\" else extract(dirname, len-1, SOME 1)
- in
- case x of
- "\\" => dirname ^ filename
- | ":" => dirname ^ filename
- | _ => dirname ^ "\\" ^ filename
- end;
-
- fun is_absolute n =
- let val len = size n in
- (len >= 2 andalso extract(n, 1, SOME 1) = ":") orelse
- (len >= 1 andalso extract(n, 0, SOME 1) = "\\") orelse
- (len >= 2 andalso extract(n, 0, SOME 2) = ".\\") orelse
- (len >= 3 andalso extract(n, 0, SOME 3) = "..\\")
- end;
-
- fun sep_pos s =
- let fun pos i =
- if i < 0 then NONE else
- case extract(s, i, SOME 1) of
- "/" => SOME i
- | "\\" => SOME i
- | ":" => SOME i
- | _ => pos (i - 1)
- in pos (size s - 1) end
- ;
-
- fun basename name =
- case sep_pos name of
- SOME p =>
- extract(name, p+1, NONE)
- | NONE => name
- ;
-
- fun dirname name =
- let val len = size name in
- if len >= 2 andalso extract(name, 1, SOME 1) = ":" then
- extract(name, 0, SOME 2) ^
- dirname (extract(name, 2, NONE))
- else if name = "/" orelse name = "\\" then
- name
- else
- case sep_pos name of
- SOME p => extract(name, 0, SOME p)
- | NONE => "."
- end;
-
- #endif
-